# 一、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def greet(self):
        print("Hello, my name is {} and I am {} years old.".format(self.name, self.age))

# 二、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
class Human:
    def __init__(self, name, hobby, weight):
        self.name = name
        self.hobby = hobby
        self.weight = weight
    def run(self):
        self.weight -= 0.5
    def eat(self):
        self.weight += 1
    def introduce(self):
        print("My name is {}, I like {} hobby, and I am {}.".format(self.name, self.hobby, self.weight))


# 三、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
    def get_max(self):
        return max(self.score)

    def save_to_file(self):
        with open('students_info.txt', 'at','utf-8') as file:
            file.write(
                f'{{"姓名":"{self.name}","年龄":{self.age},"成绩":{{"语文":{self.score["语文"]},"数学":{self.score["数学"]},"英语":{self.score["英语"]}}}}}\n')
student1 = Student("张三", 20, {"语文": 90, "数学": 95, "英语": 88})
print(student1.get_name())
print(student1.get_age())
print(student1.get_max())
# 四、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
class StudentSystem:
    def __init__(self):
        self.students = []
    def add_student(self, name, age, address, phone):
        student = {"name": name, "age": age, "address": address, "phone": phone}
        self.students.append(student)
        print(f"{name} 存入成功")


# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
class Dish:
    def __init__(self, name, price=0, stock=999):
        assert 0 <= price <= 15, "菜品价格必须在0到15元之间"
        self.name = name
        self.price = price
        self.stock = stock
        self.ratings = []

    def add_rating(self, rating):
        assert 0 <= rating <= 5, "评分必须在0到5之间"
        self.ratings.append(rating)
        if len(self.ratings) > 0 and sum(self.ratings) / len(self.ratings) < 3:
            self.decommission()

    def decommission(self):
        self.price = 0
        self.stock = 0
        print(f"{self.name} 因评分过低已下架")

    def sell(self):
        if self.stock > 0:
            self.stock -= 1
            return True
        else:
            print(f"{self.name} 库存不足")
            return False

    def get_average_rating(self):
        if self.ratings:
            return sum(self.ratings) / len(self.ratings)
        return 0

# 六、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果